home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifcico / ifcico.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-10  |  4.3 KB  |  214 lines

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <sys/wait.h>
  9. #include <signal.h>
  10. #ifdef HAS_SYSLOG
  11. #include <syslog.h>
  12. #endif
  13. #include "getopt.h"
  14. #include "lutil.h"
  15. #include "xutil.h"
  16. #include "ftn.h"
  17. #include "nodelist.h"
  18. #include "config.h"
  19. #include "version.h"
  20.  
  21. int master=0;
  22. int forcedcalls=0;
  23. char *forcedphone=NULL;
  24. char *forcedline=NULL;
  25. #if defined(HAS_TCP) || defined(HAS_TERM)
  26. char *inetaddr=NULL;
  27. #endif
  28. #ifdef NOISEDEBUG
  29. int junklevel=0;
  30. #endif
  31.  
  32. int call(faddr *);
  33. fa_list *callall(void);
  34. int answer(char *);
  35. void mkdirs(char*);
  36.  
  37. void usage(void)
  38. {
  39. #ifdef NOISEDEBUG
  40. #if defined(HAS_TCP) || defined(HAS_TERM)
  41.     confusage("-r<role> -j<num> -a<inetaddr> <node> ...");
  42. #else
  43.     confusage("-r<role> -j<num> <node> ...");
  44. #endif
  45.     fprintf(stderr,"-j<num>        damage every <num> byte    [%d]\n",
  46.                                 junklevel);
  47. #else
  48. #if defined(HAS_TCP) || defined(HAS_TERM)
  49.     confusage("-r<role> -a<inetaddr> <node> ...");
  50. #else
  51.     confusage("-r<role> <node> ...");
  52. #endif
  53. #endif
  54.     fprintf(stderr,"-r 0|1        1 - master, 0 - slave    [0]\n");
  55.     fprintf(stderr,"-n<phone>    forced phone number\n");
  56.     fprintf(stderr,"-l<ttydevice>    forced tty device\n");
  57. #if defined(HAS_TCP) || defined(HAS_TERM)
  58.     fprintf(stderr,"-a<inetaddr>    use TCP/IP instead of modem\n");
  59. #endif
  60.     fprintf(stderr,"  <node>    should be in domain form, e.g. f11.n22.z3\n");
  61.     fprintf(stderr,"        (this implies master mode)\n");
  62.     fprintf(stderr,"\n or: %s tsync|yoohoo|**EMSI_INQC816\n",myname);
  63.     fprintf(stderr,"        (this implies slave mode)\n");
  64. }
  65.  
  66. int main(argc,argv)
  67. int argc;
  68. char *argv[];
  69. {
  70.     int c;
  71.     fa_list *callist = NULL,*tmpl = NULL;
  72.     faddr *tmp;
  73.     int rc,maxrc;
  74.     char *answermode=NULL,*p;
  75. #ifdef NEED_FORK
  76.     pid_t child,waitret;
  77.     int status;
  78. #endif
  79.  
  80. #ifdef CICOLOG
  81.     logfacility=CICOLOG;
  82. #endif
  83.  
  84.     setmyname(argv[0]);
  85. #ifdef NOISEDEBUG
  86. #if defined(HAS_TCP) || defined(HAS_TERM)
  87.     while ((c=getopt(argc,argv,"j:x:r:n:l:a:I:h")) != -1)
  88. #else
  89.     while ((c=getopt(argc,argv,"j:x:r:n:l:I:h")) != -1)
  90. #endif
  91. #else
  92. #if defined(HAS_TCP) || defined(HAS_TERM)
  93.     while ((c=getopt(argc,argv,"x:r:n:l:a:I:h")) != -1)
  94. #else
  95.     while ((c=getopt(argc,argv,"x:r:n:l:I:h")) != -1)
  96. #endif
  97. #endif
  98.     if (confopt(c,optarg)) switch (c)
  99.     {
  100. #ifdef NOISEDEBUG
  101.     case 'j':    junklevel=atoi(optarg); break;
  102. #endif
  103.     case 'r':    master=atoi(optarg);
  104.             if ((master != 0) && (master != 1))
  105.             {
  106.                 usage();
  107.                 exit(1);
  108.             }
  109.             break;
  110.     case 'l':    forcedline=optarg; break;
  111. #if defined(HAS_TCP) || defined(HAS_TERM)
  112.     case 'a':    inetaddr=optarg; break;
  113. #endif
  114.     case 'n':    forcedphone=optarg; break;
  115.     default:    usage(); exit(1);
  116.     }
  117.  
  118.     if (readconfig())
  119.     {
  120.         fprintf(stderr,"Error getting configuration, aborting\n");
  121.         exit(1);
  122.     }
  123.  
  124.     while (argv[optind])
  125.     {
  126.         for (p=argv[optind];(*p) && (*p == '*');p++);
  127.         if ((strcasecmp(argv[optind],"tsync") == 0) ||
  128.             (strcasecmp(argv[optind],"yoohoo") == 0) ||
  129.             (strncasecmp(p,"EMSI_",5) == 0))
  130.         {
  131.             master=0;
  132.             answermode=argv[optind];
  133.             debug(10,"inbound \"%s\" mode",answermode);
  134.         }
  135.         else
  136.         {
  137.             debug(8,"callist entry \"%s\"",argv[optind]);
  138.             if ((tmp=parsefaddr(argv[optind])))
  139.             {
  140.                 if (callist == NULL)
  141.                 {
  142.                     callist=(fa_list *)xmalloc(sizeof(fa_list));
  143.                     tmpl=callist;
  144.                 }
  145.                 else
  146.                 {
  147.                     tmpl->next=(fa_list *)xmalloc(sizeof(fa_list));
  148.                     tmpl=tmpl->next;
  149.                 }
  150.                 tmpl->next=NULL;
  151.                 tmpl->addr=tmp;
  152.             }
  153.             else logerr("unrecognizable address \"%s\"",argv[optind]);
  154.         }
  155.         optind++;
  156.     }
  157.  
  158.     if (callist)
  159.     {
  160.         master=1;
  161.         forcedcalls=1;
  162.     }
  163.  
  164.     umask(066); /* packets may contain confidential information */
  165.  
  166.     p=xstrcpy(inbound);
  167.     p=xstrcat(p,"/tmp/");
  168.     mkdirs(p);
  169.     free(p);
  170.  
  171.     maxrc=0;
  172.     if (master)
  173.     {
  174.  
  175. #ifdef NEED_FORK
  176.         if ((child=fork()))
  177.         {
  178.             if (child == -1)
  179.             {
  180.                 logerr("$fork() error");
  181.                 exit(1);
  182.             }
  183.             while (((waitret=wait(&status)) != -1) &&
  184.                    (waitret != child))
  185.             {
  186.                 logerr("wait return %d, status %d,%d",
  187.                     waitret,status>>8,status&0xff);
  188.             }
  189.             if (status&0xff) kill(getpid(),status&0xff);
  190.             else exit(status>>8);
  191.         }
  192. #endif
  193.  
  194.         if (callist == NULL) callist=callall();
  195.         if (callist == NULL)
  196.             loginf("no outbound mail");
  197.         else for (tmpl=callist;tmpl;tmpl=tmpl->next)
  198.         {
  199.             rc=call(tmpl->addr);
  200.             loginf("call to %s %s (rc=%d)",ascfnode(tmpl->addr,0x1f),
  201.                 rc?"failed":"successfull",rc);
  202.             if (abs(rc) > maxrc) maxrc=abs(rc);
  203.         }
  204.     }
  205.     else /* slave */
  206.     {
  207.         maxrc=answer(answermode);
  208.     }
  209.  
  210.     loginf("rc=%d",maxrc);
  211.  
  212.     return maxrc;
  213. }
  214.